AWS CloudTrailログからAmazon Transcribeの利用状況を調べてみる
Amazonが提供する文字起こしサービス Amazon Transcribe が AWS CloudTrail に対応しました。 これにより、Amazon Transcribe の API の呼び出しが記録され、ログファイル送信されるようになりました。
このブログでは CloudTrail に出力される Amazon Transcribe の API ログフォーマットを確認し、さらに Amazon Athena を使って、どのような音源が文字起こしされているか簡単な集計を行ってみます。
CloudTrail で Amazon Transcribe の API ログを確認
Event history から API ログを確認します。
Amazon Transcribe の EventSource
は "transcribe.amazonaws.com" です。
この EventSource
により Amazon Transcribe の API 一覧をフィルターできます。
Amazon Transcribe の API のなかで主要な次の 3 API の出力を実際に確認します。
- ListTranscriptionJobs : Lists transcription jobs with the specified status.
- GetTranscriptionJob : Returns information about a transcription job
- StartTranscriptionJob : Starts an asynchronous job to transcribe speech to text.
Event history のフィルター条件において、 eventName
にこれら API 名を指定することでフィルターできます。
ListTranscriptionJobs API
フォーマット
不明
出力例
管理コンソールからジョブ一覧を確認したときの出力例です。
{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "XXX", "arn": "arn:aws:iam::123456789012:user/john-smith", "accountId": "123456789012", "accessKeyId": "YYY", "userName": "john-smith", "sessionContext": { "attributes": { "mfaAuthenticated": "true", "creationDate": "2018-07-05T12:33:20Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2018-07-05T21:43:03Z", "eventSource": "transcribe.amazonaws.com", "eventName": "ListTranscriptionJobs", "awsRegion": "us-east-1", "sourceIPAddress": "1.2.3.4", "userAgent": "signin.amazonaws.com", "requestParameters": { "maxResults": 20 }, "responseElements": { "transcriptionJobSummaries": [ { "languageCode": "en-US", "failureReason": "Invalid data in input media file", "transcriptionJobStatus": "FAILED", "creationTime": "Jul 5, 2018 3:58:24 PM", "transcriptionJobName": "invalid-format-b5745868-bfeb-49e6-958d-7e9cc605dcd1aaa" }, { "languageCode": "en-US", "transcriptionJobStatus": "COMPLETED", "creationTime": "Jul 5, 2018 9:08:54 AM", "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074", "completionTime": "Jul 5, 2018 9:13:36 AM" }, ... ], "nextToken": "XXX" }, "requestID": "651f8cf2-809c-11e8-b64d-5b5715dde42d", "eventID": "e2c9a1af-d376-45d2-bee9-71367139704f", "eventType": "AwsApiCall", "recipientAccountId": "123456789012" }
GetTranscriptionJob API
フォーマット
{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole | FederatedUser | IAMUser | Root | SAMLUser | WebIdentityUser", "principalId": "principal ID", "arn": "ARN", "accountId": "account ID", "accessKeyId": "access key", "userName": "user name" }, "eventTime": "timestamp", "eventSource": "transcribe.amazonaws.com", "eventName": "GetTranscriptionJob", "awsRegion": "region", "sourceIPAddress": "source IP address", "userAgent": "user agent", "requestParameters": { "transcriptionJobName": "unique job name" }, "responseElements": { "transcriptionJob": { "settings": { }, "transcriptionJobStatus": "COMPLETED | FAILED | IN_PROGRESS", "mediaFormat": "flac | mp3 | mp4 | wav", "creationTime": "timestamp", "transcriptionJobName": "unique job name", "languageCode": "en-US | es-US", "media": { "mediaFileUri": "" }, "transcript": { "transcriptFileUri": "" } } }, "requestID": "request ID", "eventID": "event ID", "eventType": "AwsApiCall", "recipientAccountId": "account id" }
出力例
管理コンソールからジョブの詳細を確認したときの出力例です。
{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "XXX", "arn": "arn:aws:iam::123456789012:user/john-smith", "accountId": "123456789012", "accessKeyId": "YYY", "userName": "john-smith", "sessionContext": { "attributes": { "mfaAuthenticated": "true", "creationDate": "2018-07-05T12:33:20Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2018-07-05T15:58:09Z", "eventSource": "transcribe.amazonaws.com", "eventName": "GetTranscriptionJob", "awsRegion": "us-east-1", "sourceIPAddress": "1.2.3.4", "userAgent": "signin.amazonaws.com", "requestParameters": { "transcriptionJobName": "0fbe57a7-7728-4ddf-beff-7cd81f7e5bc4" }, "responseElements": { "transcriptionJob": { "failureReason": "Invalid data in input media file", "settings": {}, "transcriptionJobStatus": "FAILED", "mediaFormat": "mp3", "creationTime": "Jul 5, 2018 1:53:32 PM", "transcriptionJobName": "0fbe57a7-7728-4ddf-beff-7cd81f7e5bc4", "languageCode": "en-US", "media": { "mediaFileUri": "" }, "transcript": { "transcriptFileUri": "" } } }, "requestID": "369185ba-806c-11e8-b64d-5b5715dde42d", "eventID": "4ab7b142-8ae1-43db-a080-b553ca634d9b", "eventType": "AwsApiCall", "recipientAccountId": "123456789012" }
StartTranscriptionJob API
フォーマット
{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole | FederatedUser | IAMUser | Root | SAMLUser | WebIdentityUser", "principalId": "principal ID", "arn": "ARN", "accountId": "account ID", "accessKeyId": "access key", "userName": "user name" }, "eventTime": "timestamp", "eventSource": "transcribe.amazonaws.com", "eventName": "StartTranscriptionJob", "awsRegion": "region", "sourceIPAddress": "source IP address", "userAgent": "user agent", "requestParameters": { "mediaFormat": "flac | mp3 | mp4 | wav", "languageCode": "en-US | es-US", "transcriptionJobName": "unique job name", "media": { "mediaFileUri": "" } }, "responseElements": { "transcriptionJob": { "transcriptionJobStatus": "IN_PROGRESS", "mediaFormat": "flac | mp3 | mp4 | wav", "creationTime": "timestamp", "transcriptionJobName": "unique job name", "languageCode": "en-US | es-US", "media": { "mediaFileUri": "" } } }, "requestID": "request ID", "eventID": "event ID", "eventType": "AwsApiCall", "recipientAccountId": "account id" }
出力例
Lambda 関数経由で StartTranscriptionJob API が呼び出されたときの実際の出力例です
{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "ABCDE:lambda-function-name", "arn": "arn:aws:sts::123456789012:assumed-role/lambda_transcribe_execution/lambda-function-name", "accountId": "123456789012", "accessKeyId": "AAA", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-07-05T09:07:49Z" }, "sessionIssuer": { "type": "Role", "principalId": "ABCDE", "arn": "arn:aws:iam::123456789012:role/lambda_transcribe_execution", "accountId": "123456789012", "userName": "lambda_transcribe_execution" } } }, "eventTime": "2018-07-05T09:08:54Z", "eventSource": "transcribe.amazonaws.com", "eventName": "StartTranscriptionJob", "awsRegion": "us-east-1", "sourceIPAddress": "1.2.3.4", "userAgent": "Boto3/1.7.30 Python/3.6.1 Linux/4.9.93-41.60.amzn1.x86_64 exec-env/AWS_Lambda_python3.6 Botocore/1.10.30", "requestParameters": { "mediaFormat": "mp3", "languageCode": "en-US", "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074", "media": { "mediaFileUri": "" } }, "responseElements": { "transcriptionJob": { "transcriptionJobStatus": "IN_PROGRESS", "mediaFormat": "mp3", "creationTime": "Jul 5, 2018 9:08:54 AM", "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074", "languageCode": "en-US", "media": { "mediaFileUri": "" } } }, "requestID": "0ab0dadc-8033-11e8-9622-95cbef352b7b", "eventID": "f02b7b6a-6716-409f-823b-3ac1ca672a5c", "eventType": "AwsApiCall", "recipientAccountId": "123456789012" }
Athena で Transcribe の CloudTrail ログを検索
最後に Amazon Athena を使い、Transcribe の CloudTrail ログに対してクエリーを実行します。
準備
Athena と CloudTrail を連携する際、以前は手動でデータの定義が必要でした。 現在は、次のブログで紹介しているように、簡単な操作により、自動的にテーブルが作成されます。
SQL 例
サービスの利用状況を調べる
CloudTrail にある StartTranscriptionJob
API ログをもとに、文字起こしされている
- メディアフォーマット
- 言語
の組み合わせ件数を日別に出力したい場合、以下のような SQL を実行します。
SELECT substr(eventTime, 1, 10) AS date, cast(json_extract(responseElements, '$.transcriptionJob.mediaFormat') AS VARCHAR) AS mediaFormat, cast(json_extract(responseElements, '$.transcriptionJob.languageCode') AS VARCHAR) AS languageCode, count(*) AS cnt FROM cloudtrail_logs_cloudtrail_us_east_1_123456789012 WHERE eventsource = 'transcribe.amazonaws.com' AND eventname = 'StartTranscriptionJob' GROUP BY 1, 2, 3 ORDER BY 1 ,2, 3
responseElements
は
"responseElements": { "transcriptionJob": { "transcriptionJobStatus": "IN_PROGRESS", "mediaFormat": "flac | mp3 | mp4 | wav", "creationTime": "timestamp", "transcriptionJobName": "unique job name", "languageCode": "en-US | es-US", "media": { "mediaFileUri": "" } } },
という形をしているため、json_extract 関数を使い JSONPath 書式でエレメントを抽出します。
json_extract 関数の戻り値(JSON のSTRING
型)を VARCHAR
型に CAST
しているのは、JSON 型は順序関係が定まっておらず ORDER BY
できない問題を回避するためです。
SQL 実行結果例
date | mediaFormat | languageCode | cnt |
2018-07-05 | mp3 | en-US | 15 |
2018-07-05 | mp4 | en-US | 1 |
2018-07-06 | mp3 | en-US | 18 |
2018-07-06 | mp3 | es-US | 2 |
従来であれば StartTranscriptionJob
API 呼び出し時に CloudWatch カスタムメトリクスを利用するなどして、利用状況のトラッキングが必要でしたが、今後は CloudTrail のログから利用状況を復元できるようになりました。